/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.Property;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import recursos.img.pathRecusosIMG;
import transervfx.Dato.Entidad.Domicilio;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Dato.Entidad.Repartidor;
import transervfx.Dato.Entidad.ZonaRegional;
import transervfx.Dato.Validacion.ValidacionesNivelLogico;
import transervfx.Logica.GestorPais;
import transervfx.Logica.GestorRepartidor;
import transervfx.Logica.GestorZona;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.TextBoxAutoCompletar;
import utilidades.dialog.OptionPane;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author meli
 */
public class ModificarRepartidor extends VentanaModal {

    
    static private Integer nroDocViejo;
 
    
    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 500;
    
    @FXML
    private TextField apellido;
    @FXML
    private TextField nombres;
    @FXML
    private ComboBox<String> tipoDoc;
    @FXML
    private IntegerTextField nroDoc;
    @FXML
    private TextField calle;
    @FXML
    private IntegerTextField numero;
    @FXML
    private IntegerTextField piso;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField codigoPostal;
    @FXML
    private TextBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBox<Provincia> provincia;
    @FXML
    private ComboBox<Pais> pais;
    //Contacto
    @FXML
    private TextField telFijo1;
    @FXML
    private TextField telFijo2;
    @FXML
    private TextField telCelular1;
    @FXML
    private TextField telCelular2;
    @FXML
    private TextField email;
    //Datos fiscales
    @FXML
    private IntegerTextField cuit;
    @FXML
    private ComboBox<String> condicionFrenteIva;
    //Servicio ofrecido
    @FXML
    private CheckBox externo;
    @FXML
    private ComboBox<String> movilidad;
    @FXML
    private ComboBox<Pais> paisZonaDisp;
    @FXML
    private ComboBox<Provincia> provinciaZonaDisp;
    @FXML
    private ComboBox<Localidad> localidadZonaDisp;
    @FXML
    private TextBoxAutoCompletar<ZonaRegional> zonaDisp;
    @FXML
    private TableView<ZonaRegional> tableZonasAsignadas;
    @FXML
    private TableColumn tableColumLocalidad;
    @FXML
    private TableColumn tableColumZona;
    final Tooltip tooltip = new Tooltip();
    //las zonas regionales internamente tienen un ZonaRegional y el nombre q muestra es el q esta en el metodo
    //tostring de zona regional
    //@FXML
    //private ComboBox<ZonaRegional> zonasRegionals;
    final ObservableList<Pais> dataSourcePais = FXCollections.observableArrayList();
    final ObservableList<Provincia> dataSourceProvincia = FXCollections.observableArrayList();
    final ObservableList<Localidad> dataSourceLocalidad = FXCollections.observableArrayList();
    final ObservableList<ZonaRegional> dataSourceZonasDisponibles = FXCollections.observableArrayList();
    final ObservableList<ZonaRegional> dataSourceTablaZonasAsignadas = FXCollections.observableArrayList();
    //este es el dataSource de la zona regional, es la fuente de datos :)
    //final ObservableList<ZonaRegional> dataSourceZona = FXCollections.observableArrayList();
    //no lo se ja sisi ahora anda vas a ver
    private Repartidor repartidorView;
    private Domicilio domicilioView ;
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    public ModificarRepartidor(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        init();
    }

    public ModificarRepartidor(Repartidor repartidorSeleccionado, ABMRepartidor ventanaPadre, String titulo, int x, int y) {
        super( ventanaPadre, titulo, x,  y);

        //x eso me preguntabass? ni me di cuenta si ja jajajja  aver
        nroDocViejo=repartidorSeleccionado.getNroDoc();
        this.repartidorView = repartidorSeleccionado;
        this.domicilioView = repartidorSeleccionado.getDomicilio();

        //aca el drama es q el binding lo hace en una sola direccion, ya vemos como solucionarlo
        System.out.println("repartidor a modificar en la ventana MODIFICAR : " + repartidorView.getApellido());
         init();

    }
    
    
    public void init() {
        try {

            this.cargarPaicesProvinciasLocalidades();

            this.cargarPaicesProvinciasLocalidadesZonas();

            this.setTablaZonasAsignadas();
            
            //Linqueo interfaz con bean
            this.bindingInterfazConBean(this.repartidorView, this.domicilioView);

            //Creo todos los escuchadores
            this.crearEscuchadores();

        } catch (NoSuchMethodException ex) {
            Logger.getLogger(ModificarRepartidor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    private void bindingInterfazConBean(Repartidor repartidorView, Domicilio domicilioView) throws NoSuchMethodException {

        nombres.textProperty().bindBidirectional(repartidorView.getPROP_NOMBRES());
        //repartidorView.getPROP_NOMBRES().bindBidirectional(nombres.textProperty());
        apellido.textProperty().bindBidirectional(repartidorView.getPROP_APELLIDO());

        tipoDoc.valueProperty().bind(repartidorView.getPROP_TIPODOC());
        repartidorView.getPROP_TIPODOC().bind(tipoDoc.getSelectionModel().selectedItemProperty());

        nroDoc.numberProperty().bindBidirectional(repartidorView.getPROP_NRODOC());
        
        externo.selectedProperty().bindBidirectional(repartidorView.getPROP_EXTERNO());

        movilidad.valueProperty().bind(repartidorView.getPROP_MOVILIDAD());
        repartidorView.getPROP_MOVILIDAD().bind(movilidad.getSelectionModel().selectedItemProperty());

        telCelular1.textProperty().bindBidirectional(repartidorView.getPROP_TELCELULAR1());
        telCelular2.textProperty().bindBidirectional(repartidorView.getPROP_TELCELULAR2());
        telFijo1.textProperty().bindBidirectional(repartidorView.getPROP_TELFIJO1());
        telFijo2.textProperty().bindBidirectional(repartidorView.getPROP_TELFIJO2());
        email.textProperty().bindBidirectional(repartidorView.getPROP_EMAIL());

        cuit.numberProperty().bindBidirectional(repartidorView.getPROP_CUIT());
        condicionFrenteIva.valueProperty().bind(repartidorView.getPROP_CONDICIONFRENTEIVA());


        this.externo.selectedProperty().bindBidirectional(repartidorView.getPROP_EXTERNO());

      
        calle.textProperty().bindBidirectional(domicilioView.getPROP_CALLE());
        numero.numberProperty().bindBidirectional(domicilioView.getPROP_NUMERO());
        piso.numberProperty().bindBidirectional(domicilioView.getPROP_PISO());
        departamento.textProperty().bindBidirectional(domicilioView.getPROP_DEPARTAMENTO());

      
       
        this.provincia.getSelectionModel().select(domicilioView.getLocalidad().getProvincia());
        //this.localidad.seleccionar(domicilioView.getLocalidad());
        //el de arriba es x las dudas si tira error este ok
        this.localidad.setText(domicilioView.getLocalidad().getNombre());
   
             
      
        System.out.println("ZONAS REGIONALES "+this.repartidorView.getZonasRegionals());
       
        
        this.dataSourceTablaZonasAsignadas.addAll(this.repartidorView.getZonasRegionals());
          
       
       
        

    }

    private void crearEscuchadores() {

        this.apellido.textProperty().addListener(this.escuchadorInput);
        this.nombres.textProperty().addListener(this.escuchadorInput);
        this.nroDoc.textProperty().addListener(this.escuchadorInput);
        this.tipoDoc.valueProperty().addListener(this.escuchadorInput);

        this.telCelular1.textProperty().addListener(this.escuchadorInput);
        this.telCelular2.textProperty().addListener(this.escuchadorInput);
        this.telFijo1.textProperty().addListener(this.escuchadorInput);
        this.telFijo2.textProperty().addListener(this.escuchadorInput);
        this.email.textProperty().addListener(this.escuchadorInput);

        this.cuit.textProperty().addListener(this.escuchadorInput);
        this.condicionFrenteIva.valueProperty().addListener(this.escuchadorInput);


        this.calle.textProperty().addListener(this.escuchadorInputDomicilio);
        this.departamento.textProperty().addListener(this.escuchadorInputDomicilio);
        this.piso.textProperty().addListener(this.escuchadorInputDomicilio);
        this.numero.textProperty().addListener(this.escuchadorInputDomicilio);


        this.apellido.focusedProperty().addListener(this.escuchadorFoco);
        this.nombres.focusedProperty().addListener(this.escuchadorFoco);
        this.tipoDoc.focusedProperty().addListener(this.escuchadorFoco);
        this.nroDoc.focusedProperty().addListener(this.escuchadorFoco);

        this.telCelular1.focusedProperty().addListener(this.escuchadorFoco);
        this.telCelular2.focusedProperty().addListener(this.escuchadorFoco);
        this.telFijo1.focusedProperty().addListener(this.escuchadorFoco);
        this.telFijo2.focusedProperty().addListener(this.escuchadorFoco);
        this.email.focusedProperty().addListener(this.escuchadorFoco);

        this.cuit.focusedProperty().addListener(this.escuchadorFoco);
        this.condicionFrenteIva.focusedProperty().addListener(this.escuchadorFoco);


        this.calle.focusedProperty().addListener(this.escuchadorFocoDomicilio);
        this.departamento.focusedProperty().addListener(this.escuchadorFocoDomicilio);
        this.piso.focusedProperty().addListener(this.escuchadorFocoDomicilio);
        this.numero.focusedProperty().addListener(this.escuchadorFocoDomicilio);

        this.localidad.getTextField().focusedProperty().addListener(this.escuchadorFocoDomicilio);

        this.externo.focusedProperty().addListener(this.escuchadorFoco);
        this.movilidad.focusedProperty().addListener(this.escuchadorFoco);


    }

    private void cargarPaicesProvinciasLocalidades() {

        localidad.setData(dataSourceLocalidad);
        provincia.setItems(dataSourceProvincia);
        dataSourcePais.addAll(GestorPais.getInstance().paises());
        pais.setItems(dataSourcePais);


        provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> selected, Provincia oldValue, Provincia newValue) {
                if (newValue != null) {
                    localidad.setText("");
                    localidad.setData(GestorPais.getInstance().localidades(newValue));

                    //dataSourceProvincia.clear();
                    //dataSourceProvincia.addAll( GestorPais.getInstance().provincias(newValue));
                }
            }
        });


        pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {
            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                    System.out.println("selecciono pais " + arg2.getId());
                    dataSourceProvincia.clear();
                    dataSourceProvincia.addAll(GestorPais.getInstance().provincias(arg2));
                }
            }
        });

        pais.getSelectionModel().select(0);
        provincia.getSelectionModel().select(21);
    }

    private void cargarPaicesProvinciasLocalidadesZonas() {

        zonaDisp.setData(this.dataSourceZonasDisponibles);
        localidadZonaDisp.setItems(dataSourceLocalidad);
        provinciaZonaDisp.setItems(dataSourceProvincia);
        dataSourcePais.addAll(GestorPais.getInstance().paises());

        paisZonaDisp.setItems(dataSourcePais);



        this.localidadZonaDisp.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Localidad>() {
            @Override
            public void changed(ObservableValue<? extends Localidad> selected, Localidad oldValue, Localidad newValue) {
                if (newValue != null) {

                    zonaDisp.setText("");
                    dataSourceZonasDisponibles.clear();
                    List<ZonaRegional> listZonaPorLocalidadSeleccionada = GestorPais.getInstance().zonas(newValue);
                    dataSourceZonasDisponibles.addAll(listZonaPorLocalidadSeleccionada);
                    //formatTooltipsConZonas(listZonaPorLocalidadSeleccionada);
                    zonaDisp.setData(listZonaPorLocalidadSeleccionada);

                }
            }
        });

        provinciaZonaDisp.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> selected, Provincia oldValue, Provincia newValue) {
                if (newValue != null) {

                    dataSourceLocalidad.clear();
                    dataSourceLocalidad.addAll(GestorPais.getInstance().localidades(newValue));

                    //dataSourceProvincia.clear();
                    //dataSourceProvincia.addAll( GestorPais.getInstance().provincias(newValue));
                }
            }
        });


        paisZonaDisp.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {
            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                    System.out.println("selecciono pais " + arg2.getId());
                    dataSourceProvincia.clear();
                    dataSourceProvincia.addAll(GestorPais.getInstance().provincias(arg2));
                }
            }
        });

        paisZonaDisp.getSelectionModel().select(0);
        provinciaZonaDisp.getSelectionModel().select(21);
        localidadZonaDisp.getSelectionModel().select(46);
    }

    private void setTablaZonasAsignadas() {

        this.tableZonasAsignadas.setItems(this.dataSourceTablaZonasAsignadas);
        tableZonasAsignadas.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        //Hace un binding entre la columna y las propiedades de la ZonaRegional
        this.tableColumZona.setCellValueFactory(new PropertyValueFactory<ZonaRegional, String>("nombre"));

        this.tableColumLocalidad.setCellValueFactory(new Callback<CellDataFeatures<ZonaRegional, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(CellDataFeatures<ZonaRegional, String> p) {
                // p.getValue() returns the Person instance for a particular TableView row
                return new SimpleStringProperty(p.getValue().getLocalidad().getNombre());
            }
        });
    }

    

    public void buttonAceptar() throws NoSuchMethodException, IOException {
 
      
        
        //si el tipodoc no esta seteado y es null, entonces pasa la validacion, no existe el repartidor,
        //pero luego tendria q dar q esta mal en las otras validaciones
        //ok, aca me pregunto si existe el repartidor en la bd

        //o algo del validar porq lo del binding lo copie tal cual... 
        //si pero como puede ser que ande en un lado y no en el otro
        //mmmmym motra cosa es que no nos fijamos si error de hoy era por las zonas 

        if (validarControl(this.apellido) & validarControl(this.nombres) & validarControl(this.tipoDoc) & validarControl(this.nroDoc)
                & validarControlDomicilio(this.calle) & validarControlDomicilio(this.numero)
                & validarControlDomicilio(this.localidad.getTextField())) {


            //queria mostrarte una cosa antes de que te vallas
            if(!this.repartidorView.getNroDoc().equals(nroDocViejo)){          
                if (GestorRepartidor.getInstance().existeRepartidor(this.repartidorView.getTipoDoc(), repartidorView.getNroDoc())) {


                     String[] textoBotones = {"Aceptar igualmente", "Corregir"};
                     String msj = "El documento tipo " + this.repartidorView.getTipoDoc() + " número " + this.repartidorView.getNroDoc() + " ya existen en el sistema para otro repartidor.\n";
                     int nroBotonApretado = OptionPane.showOptionDialog("Cuidado!", msj, null, OptionPane.WARNING_MESSAGE, textoBotones);
                     if (nroBotonApretado == 0) {
                     } else {
                     if (nroBotonApretado == 1) {
                     return;
                     }
                     }
                 }
            }


            Localidad loc = this.localidad.getValue();

            if (loc != null) {

                this.domicilioView.setLocalidad(loc);

                this.repartidorView.setDomicilio(this.domicilioView);

                repartidorView.setZonasRegionals(dataSourceTablaZonasAsignadas);

                GestorRepartidor.getInstance().actualizarRepartidor(repartidorView);
//tengo una idea, aguanta y te la muestro,ok pero no se donde puse el ultimo codigo
               
                ((ABMRepartidor) this.ventanaPadre).modificarRepartidorEnTableRepartidores(repartidorView);


                String[] textoBotones = {"Aceptar"};

                String msj = "El repartidor '" + repartidorView.getApellido() + " " + repartidorView.getNombres() + "' ha sido satisfactoriamente modificado en el sistema.\n";

                OptionPane.showOptionDialog("Repartidor modificado", msj, null, OptionPane.SUCESS_MESSAGE, textoBotones);


                this.close();

            } else {

                System.out.println("Repartidor no modificado");
            }
        } else {
            //ESTO ME PA QUE NO SERIA NECESARIO!
            //Aca deberiamos pintar los campos que estan mal ingresados o los campos
            //obligatorios que faltan.
        }


    }

    public void buttonCancelar(ActionEvent event) {
        System.out.println(((Button) event.getSource()).getText());
        this.close();
    }

    public void buttonMenos() {
        this.dataSourceTablaZonasAsignadas.removeAll(new ArrayList(this.tableZonasAsignadas.getSelectionModel().getSelectedItems()));
        this.tableZonasAsignadas.getSelectionModel().clearSelection();
    }

    public void buttonMas() {

        String nombreZona = this.zonaDisp.getText();
        if (nombreZona != null) {
            ZonaRegional zonaActualSeleccionada = GestorZona.getInstance().findByNombre(nombreZona, this.localidadZonaDisp.getSelectionModel().getSelectedItem());

            System.out.println("entra a guardar y zonaActual esta persistida? " + zonaActualSeleccionada);

            if (zonaActualSeleccionada != null) {

                //Si la tabla de zonas no contiene la zona selecciona la agrega, sino no. 
                if (!this.dataSourceTablaZonasAsignadas.contains((ZonaRegional) zonaActualSeleccionada)) {
                    System.out.println("NO LA CONTIENE => LA AGREGA");
                    this.dataSourceTablaZonasAsignadas.add(zonaActualSeleccionada);
                }
            }

            System.out.println("la lista q contiene la tabla es de tam: " + dataSourceTablaZonasAsignadas.size());
        }

    }

    public void buttonCrearZona() {

  

            Provincia provSeleccionada = this.provinciaZonaDisp.getSelectionModel().getSelectedItem();
            Localidad localidadSeleccionada = this.localidadZonaDisp.getSelectionModel().getSelectedItem();

            if (provSeleccionada != null & localidadSeleccionada != null) {

                CrearZonas ventanaZR = new CrearZonas(this,"Crear zona",  600, 320);


                //A la ventana "CrearZonaFXML" le paso como parametros la provincia y la localidad que seleccionamos 
                //en la seccion de "Zonas Disponibles".
                ventanaZR.setProvinciaLocalidad(provSeleccionada, localidadSeleccionada);

            } else {

                String[] textoBotones = {"Aceptar"};
                String msj = "Para crear una zona nueva debe seleccionar previamente la provincia y la localidad.";
                OptionPane.showOptionDialog("Error!", msj, null, OptionPane.ERROR_MESSAGE, textoBotones);
            }

        

    }

    //Esta funcion sera llamada por la ventana "CrearZonaFXML" para que cuando agregue la zona a la BD, se actualice
    //la lista de zonas de la seccion de Zonas Disponibles de la ventana "CrearRepartidorFXML".
    void actualizarListZona(String zonaAgregada) {

        dataSourceZonasDisponibles.clear();
        List<ZonaRegional> listZonaPorLocalidadSeleccionada = GestorPais.getInstance().zonas(this.localidadZonaDisp.getSelectionModel().getSelectedItem());

        dataSourceZonasDisponibles.addAll(listZonaPorLocalidadSeleccionada);

        this.zonaDisp.setText(zonaAgregada);

        zonaDisp.setData(listZonaPorLocalidadSeleccionada);
    }

    
    ChangeListener escuchadorInput = new ChangeListener<String>() {
        @Override
        public void changed(
                ObservableValue observableValue, String s, String s1) {

            if (!s1.equals(s)) {
                // delay location updates to we don't go too fast file typing
                final Control control = ((Control) ((Property) observableValue).getBean());

                // si esta corriendo lo detengo
                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent actionEvent) {

                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                //solo valido a nivel logico
                                //validar(control, ValidacionesNivelLogico.class, null);
                            }
                        }));
                locationUpdateTimeline.play();

            }

        }
    };
    ChangeListener escuchadorInputDomicilio = new ChangeListener<String>() {
        @Override
        public void changed(
                ObservableValue observableValue,
                String s, String s1) {

            if (!s1.equals(s)) {
                // delay location updates to we don't go too fast file typing
                final Control control = ((Control) ((Property) observableValue).getBean());


                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent actionEvent) {
                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                //solo valido a nivel logico
                                //validarDomicilio(control, ValidacionesNivelLogico.class);
                            }
                        }));
                locationUpdateTimeline.play();

            }

        }
    };
    private ChangeListener<Boolean> escuchadorFoco = new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            //si tiene el foco
            //obtenes el componente q tiene el foco o el q perdio el foco dependiendo de lo q hace
            Control control = (Control) ((ReadOnlyBooleanProperty) observable).getBean();
            //esto le dice si tiene el foco, o si lo perdio
            if (newValue.booleanValue()) {
                //  System.out.println("textfield focused "+((ReadOnlyBooleanProperty)observable).getBean());
                System.out.println("Foco nuevo Repartidor" + ((ReadOnlyBooleanProperty) observable).getBean());
            } else //Si pierde el foco
            {
                //si pierde el foco valida
                System.out.println("Foco viejo Repartidor" + ((ReadOnlyBooleanProperty) observable).getBean());
                //y le pasa el controlador (comonente) q perdio el foco
                
                System.out.println("entra a validar el campo para el Repartidor");
                validarControl(control);

            }
        }
    };

    
    private ChangeListener<Boolean> escuchadorFocoDomicilio = new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
            //si tiene el foco
            //obtenes el componente q tiene el foco o el q perdio el foco dependiendo de lo q hace
            Control control = (Control) ((ReadOnlyBooleanProperty) observable).getBean();
            //esto le dice si tiene el foco, o si lo perdio
            if (newValue.booleanValue()) {
                //  System.out.println("textfield focused "+((ReadOnlyBooleanProperty)observable).getBean());
                System.out.println("Foco nuevo" + ((ReadOnlyBooleanProperty) observable).getBean());
            } else //Si pierde el foco
            {
                //si pierde el foco valida
                System.out.println("Foco viejo" + ((ReadOnlyBooleanProperty) observable).getBean());
                //y le pasa el controlador (comonente) q perdio el foco
                validarControlDomicilio(control);

            }
        }
    };

   //el validador valida por componente
    public boolean validarControl(Control control) {
        //este texto va guardando los errores a mostrar en el tootips
        String text = "";
        //ahi obtiene el nombre del componente, q tiene q ser igual al nombre del atributo del objeto Usurio.nombre por ejemplo

        String nombreDelInput = control.getId();


        
        //  if(control==nombreUsuario){

        //seteo el texto del tooltips en "", limpio el tootips del componente   
        control.getTooltip().setText(text);
        //tomo todos los errores de ese componente, para esa propiedad del usuarioView
        //EJ: si TextField[nombreUsuario] entonces valido usuarioView la propiedad nombreUsuario
        //y obtengo la coleccion de errores errorsProperty de esa propiedad del utusiaroView



        Set<ConstraintViolation<Repartidor>> errorsProperty = validator.validateProperty(this.repartidorView, nombreDelInput, ValidacionesNivelLogico.class);
        //si no hay errores
        if (errorsProperty.isEmpty()) {

         
            //seteo la imagen satifactoria
            control.getTooltip().setGraphic(crearImagenSuccess());
            //agrego al tootips el texto sin errores
            control.getTooltip().setText("SIN ERRORES");
            //le saco el borde rojo
            control.setStyle("-fx-border-color: null;");
            //retorno q la validacion del campo fue correcta
            return true;
        } //si hay errores, porq errorsProperty tiene msj de errores en su interior
        else {

            
            control.getTooltip().setGraphic(crearImagenError());
            text = "ERRORES: ";
            control.setStyle("-fx-border-color: RED;");
            // control.getStyleClass().clear();
            // control.getStyleClass().add("controlError");
            for (ConstraintViolation<Repartidor> userError : errorsProperty) {
                text = text + "\n" + userError.getMessage();
            }

            control.getTooltip().setText(text);

            //si no tiene errores retorna verdadero
        }
        //}

        return false;
    }

    public boolean validarControlDomicilio(Control control) {

        //otra cosa, 
        //1-estaba intentando hacer el validador de NoExisteRepartidor, pero no se por que buscar
        //quie seria unico el tipo y nro de doc
        //o busco por otra cosa?
        //igual me da error y no se si e4sta bien lo que hice
        //mira
        //tene en cuenta que quiero pasar dos parametros al gestor 
        //mira

        if (control.getId().equals("localidad")) {
            Localidad locSeleccionada = this.localidad.getValue();
            this.domicilioView.setLocalidad(locSeleccionada);
        }


        //este texto va guardando los errores a mostrar en el tootips
        String text = "";
        //ahi obtiene el nombre del componente, q tiene q ser igual al nombre del atributo del objeto Usurio.nombre por ejemplo

        String nombreDelInput = control.getId();


        //  if(control==nombreUsuario){

        //seteo el texto del tooltips en "", limpio el tootips del componente   
        control.getTooltip().setText(text);
        //tomo todos los errores de ese componente, para esa propiedad del usuarioView
        //EJ: si TextField[nombreUsuario] entonces valido usuarioView la propiedad nombreUsuario
        //y obtengo la coleccion de errores errorsProperty de esa propiedad del utusiaroView



        Set<ConstraintViolation<Domicilio>> errorsProperty = validator.validateProperty(this.domicilioView, nombreDelInput, ValidacionesNivelLogico.class);
        //si no hay errores
        if (errorsProperty.isEmpty()) {
            System.out.println("NO HAY errores alVALIDA DOMI");
            //seteo la imagen satifactoria
            control.getTooltip().setGraphic(crearImagenSuccess());
            //agrego al tootips el texto sin errores
            control.getTooltip().setText("SIN ERRORES");
            //le saco el borde rojo
            control.setStyle("-fx-border-color: null;");
            //retorno q la validacion del campo fue correcta
            return true;
        } //si hay errores, porq errorsProperty tiene msj de errores en su interior
        else {

            control.getTooltip().setGraphic(crearImagenError());
            text = "ERRORES: ";
            control.setStyle("-fx-border-color: RED;");

            System.out.println("hay errores alVALIDA DOMI");

            // control.getStyleClass().clear();
            // control.getStyleClass().add("controlError");
            for (ConstraintViolation<Domicilio> userError : errorsProperty) {
                text = text + "\n" + userError.getMessage();
            }

            control.getTooltip().setText(text);

            //si no tiene errores retorna verdadero
        }
        //}

        return false;
    }

    //solo crea las imagens de errores y de satifactorio
    private ImageView crearImagenSuccess() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("success.png"));

        return new ImageView(image);
    }

    private ImageView crearImagenError() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("error.png"));
        return new ImageView(image);
    }


   /* yo lo9 comento si queres
     * IMPORTANTEEE --> POR AHORA METODOS NO USADOS esto no va
     */
   /*  private boolean validar(Control control, Class nivel1, Class nivel2) {
        String idProperty = control.getId();
        System.out.println("id de la propiedad " + idProperty);
        Set<ConstraintViolation<Repartidor>> errorsProperty = validator.validateProperty(this.repartidorView, idProperty, nivel1);
        Set<ConstraintViolation<Repartidor>> errorsProperty2;

        Control t = control;
        //VBox v = (VBox) control.getParent();
        //v.getChildren().clear();
        //v.getChildren().add(t);

        GridPane v = (GridPane) control.getParent();
        v.getChildren().clear();
        v.getChildren().add(v);

        for (ConstraintViolation<Repartidor> userError : errorsProperty) {
            Label error = new Label(userError.getMessage());
            error.getStyleClass().add("labelError");
            v.getChildren().add(error);

        }

        if (nivel2 != null) {
            errorsProperty2 = validator.validateProperty(this.repartidorView, idProperty, nivel2);
            for (ConstraintViolation<Repartidor> userError : errorsProperty2) {
                Label error = new Label(userError.getMessage());
                error.getStyleClass().add("labelError");
                v.getChildren().add(error);

            }
        }

        return errorsProperty.isEmpty();
    }
    
    
este metodo quedo viejo no sirve mas los deje por si por ahi neesitana algun ejemplo
    private boolean validarLocalidad(Control control) {
        System.out.println("Entra " + 1);
        if (!this.localidad.getText().isEmpty()) {
            System.out.println("Entra " + 2);
            Localidad loc = GestorPais.getInstance().buscarLocalidad(dataSourceLocalidad, this.localidad.getText());

            if (loc == null) {
                System.out.println("Entra la localidad no existe " + this.localidad.getText());
                loc = new Localidad(this.localidad.getText(), this.provincia.getSelectionModel().getSelectedItem());
            }

            this.repartidorView.getDomicilio().setLocalidad(loc);
        }

        Set<ConstraintViolation<Repartidor>> errorsProperty = validator.validateProperty(this.repartidorView, "localidad", ValidacionesNivelLogico.class);

        Control t = control;
        VBox v = (VBox) control.getParent();
        v.getChildren().clear();
        v.getChildren().add(t);
        for (ConstraintViolation<Repartidor> userError : errorsProperty) {
            Label error = new Label(userError.getMessage());
            error.getStyleClass().add("labelError");
            v.getChildren().add(error);

        }

        return errorsProperty.isEmpty();
    }

    private void formatTooltipsConZonas(List<ZonaRegional> listZonaPorLocalidadSeleccionada) {

        this.tooltip.setText("Zonas Disponibles\n\n");

        for (ZonaRegional z : listZonaPorLocalidadSeleccionada) {
            System.out.println("zona regiona es: " + z.getNombre());
            this.tooltip.setText(this.tooltip.getText() + z.getNombre() + "\n");
        }
    }*/
    
    @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("CrearRepartidorFXML.fxml");
    }
}
